/**
 * 服务端启动入口
 * **/
import { createApp } from "./app";

export default async (context) => {
  // 因为有可能会是异步路由钩子函数或组件，所以我们将返回一个 Promise，
  // 以便服务器能够等待所有的内容在渲染前，
  // 就已经准备就绪。
  const { app, router, store } = createApp();

  //获取meta信息
  const meta = app.$meta();

  // 设置服务器端 router 的位置
  router.push(context.url);

  context.meta = meta;

  // 等到 router 将可能的异步组件和钩子函数解析完
  await new Promise(router.onReady.bind(router));

  // 他会在服务端渲染应用渲染完毕以后，然后被调用,我们可以获取当服务端渲染好的应用数据
  context.rendered = () => {
    // renderer 会把 context.state 数据对象内联到页面模板中
    // 最终发送给客户端的页面中会包含一段脚本 ：window._INITIAL_STATE_ = context.state
    // 客服端就要把页面中的 window._INITIAL_STATE_ 拿出来填充到客户端 store容器中
    context.state = store.state;
  };

  return app;
};

/* import { createApp } from './app'

export default context => {
  // 因为有可能会是异步路由钩子函数或组件，所以我们将返回一个 Promise，
    // 以便服务器能够等待所有的内容在渲染前，
    // 就已经准备就绪。
  return new Promise((resolve, reject) => {
    const { app, router } = createApp()

    // 设置服务器端 router 的位置
    router.push(context.url)

    // 等到 router 将可能的异步组件和钩子函数解析完
    router.onReady(() => {
      const matchedComponents = router.getMatchedComponents()
      // 匹配不到的路由，执行 reject 函数，并返回 404
      if (!matchedComponents.length) {
        return reject({ code: 404 })
      }

      // Promise 应该 resolve 应用程序实例，以便它可以渲染
      resolve(app)
    }, reject)
  })
} */
